
#include "nane/core/crt/crt.h"
#include "nane/core/crt/Context.h"
#include "nane/core/crt/defaultErrorHandler.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Context* m_context = NULL;
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool InitializeCRT( bool _enableStdLogger )
    {
        m_context = new Context;
        m_context->logSystem = NULL;
        m_context->fileSystem = NULL;
        m_context->timeSystem = NULL;
        m_context->moduleSystem = NULL;
        m_context->errorHandler = NULL;
        
        if( LogManager::Initialize(_enableStdLogger) == false
           || FileSystem::Initialize() == false
           || Time::Initialize() == false
           || ModuleManager::Initialize() == false )
        {
            ShutdownCRT();
            return false;
        }
        
        
        SetErrorHandler(&DefaultErrorHandler);
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void ShutdownCRT()
    {
        ModuleManager::Shutdown();
        Time::Shutdown();
        FileSystem::Shutdown();
        LogManager::Shutdown();
        delete m_context;
        m_context = NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void CopyCRT( Context* _context )
    {
        m_context = _context;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ErrorHandler SetErrorHandler( ErrorHandler _handler )
    {
        ErrorHandler oldHandler = m_context->errorHandler;
        m_context->errorHandler = _handler;
        return oldHandler;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
